AWS IoT Coreで受け取ったデバイスデータをAmazon DynamoDBに保存してみた
IoTデバイスデータを保存したい
おのやんです。
みなさん、IoTデバイスから送信されるデータをデータベースに保存したいと思ったことはありませんか?私はあります。
AWSには、IoTデバイスをAWSと接続して簡単にデータがやりとりできるAWS IoT Core(以下、IoT Core)というサービスがあります。IoT Coreを経由すれば、IoTデバイスから送信されたデバイスデータをAWSの他のサービスに受け渡すことができます。
今回は、IoTデバイスからIoT Coreに送信されたデータをAmazon DynamoDB(以下、DynamoDB)に保存する機会がありましたので、そのやり方などをまとめていきたいと思います。
構成
今回はこちらのシンプルな構成で進めます。IoT Coreに接続したデバイスからIoT Core に向けてデバイスデータが送信されてきます。このデータをIoT Coreのルールでクエリし、DymanoDBに格納します。
デバイスデータの構造
IoTデバイスから送信されるデータは、今回このような構造になっています。各キーは、検証用のためチュートリアルで紹介されているデータを流用させてもらいます。
{
"TEMPERATURE": 28,
"HUMIDITY": 80,
"BAROMETER": 1013,
}
また、IoTデバイスのトピックに関しては、device-0001/pub
の形を取っています。ですので、IoTデバイスのデータをIoT Core側で受け取ると、このようなメッセージが表示されます。
この状態から、以下のJSONデータに整形してDynamoDBに格納したいと思います。
{
"deviceId": "device-0001",
"timestamp": "1722238795"
"temperature": 28,
"humidity": 80,
"barometer": 1013,
}
DynamoDBテーブルの作成
まずはデバイスデータを格納するDynamoDBテーブルを作成します。各項目の値は以下の通りです。テール部設定の部分は、今回は特別な要件は必要ないのでデフォルト設定で進めます
項目 | 値 | 備考 |
---|---|---|
テーブル名 | aws-test-device-data | |
パーティションキー | deviceId | 文字列型 |
ソートキー | timestamp | 数値型 |
テーブル設定 | デフォルト設定 |
このように、作成したDynamoDBテーブルがアクティブになればOKです。
IoT Coreルールの作成
次に、IoT Coreで受け取ったデバイスデータをDynamoDB用にクエリするIoT Coreルールを作成します。
最初の画面では、以下の項目を設定します。
項目 | 値 | 備考 |
---|---|---|
ルール名 | aws_test_device_data_query_rule | -(ハイフン) が使えないため、_(アンダースコア) を使用 |
説明 | IoT Coreで受信したデバイスデータを DynamoDBに保存する |
次に、SQL設定画面でSQL文を設定します。
今回、デバイスIDはデーバイスデータではなくトピックから取得できるため、IoT Core組み込み関数のtopic()
を使ってdeviceId
としてクエリしています。たとえば、device-0001/sub/pub
のトピック名だった場合、topic(1)
でdevice-0001
、topic(2)
でsub
が取得できます。
またDynamoDBで将来TTLを設定したい時に、TTLで指定するtimestampデータの単位を秒に合わせる必要があるので、ミリ秒で取得しているtimestamp
をFLOOR(timestamp() / 1000)
で秒に変換しています。
SELECT
topic(1) AS deviceId,
timestamp() AS timestamp,
TEMPERATURE AS temperature,
HUMIDITY AS humidity,
BAROMETER AS barometer,
FROM
'device-0001/pub'
次の画面では、SQLでクエリしたデータを使って発火させるアクションを設定します。今回はDynamoDBのテーブルにデータを入れたいため、DynamoDBv2
を選択します。
また、IoT CoreからDynamoDBテーブルへの書き込み処理をIAMで許可する必要があるので、「新しいロールを作成」から作成します。
動作確認
それでは、実際にデバイスデータがDynamoDBに送信されているか確認しましょう。
IoT Coreのナビゲーションバーに「MQTT テストクライアント」の項目があるので、こちらをクリックします。ここでトピックのフィルターにdevice-0001/pub
、メッセージペイロードにさきほどのデバイスデータを入力して、「発行」ボタンをクリックします。入力したメッセージペイロードは変わらないので、何回か「発行ボタン」をクリックすると、同様のデータが下部にどんどん表示されます。
DynamoDBテーブル内のデータは、DynamoDB画面のナビゲーションバーにある「項目を探索」から確認できます。さきほどのメッセージペイロードで何回か発行したデータが、すべてDynamoDBテーブルに保存されていることが確認できます。
IoT Coreで簡単にデータをやり取りできる
一般的に複雑な処理になりがちなIoTデバイスデータの処理ですが、IoT Coreを通すことで AWS上で簡単にデータのやり取りができます。
IoT Core経由でDynamoDBにデータを保存する際に、本記事が参考になれば幸いです。では!